package com.zpc.myvideoserver.common.security.util;

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.zpc.myvideoserver.common.security.pojo.AccountUser;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @ClassName : JwtUtil  //类名
 * @Description : Jwt工具类，用于生成JWT、解析JWT、判断JWT  //描述
 * @Author : zpc20 //作者
 * @Date: 2023/11/1  21:43
 */

@Data // lombok注解
@ConfigurationProperties(prefix = "jwt") // 注入配置文件值
@Component // 注入spring容器
public class JwtUtil {
    /**
    * @Param : expire
    * @Description : 过期时间
    * @Date: 2023/11/1
    */
    private long expire;
    /**
    * @Param : secret
    * @Description : 密钥
    * @Date: 2023/11/1
    */
    private String secret;
    /**
    * @Param : header
    * @Description : 头部信息
    * @Date: 2023/11/1
    */
    private String header;
    // @Description : 签发者 zpc20 2023/11/4 0:50
    private String prefix;

    /**
     * @Name: createToken
     * @Params : [username]:[java.lang.String]
     * @Description : 生成Token
     * @Author : zpc20
     * @Date : 2023/11/1 22:26
     * @Return java.lang.String
     * @Throws
     */
    public String createToken(AccountUser accountUser){

        /**
         * 计算过期时间
         */
        Date nowDate = new Date();
        Date expireDate = new Date(nowDate.getTime()+1000*expire);
        return Jwts.builder()
                .setId(String.valueOf(accountUser.getUserId()))
                .setHeaderParam("typ","")
                .setIssuer("zpc")//签发者
                .setSubject(accountUser.getUsername()) // 主题
                .setIssuedAt(nowDate) // 当前时间
                .claim("authorities", JSON.toJSONString(accountUser.getAuthorities())) // 自定义属性放置权限
                .setExpiration(expireDate) //过期时间
                .signWith(SignatureAlgorithm.HS512,this.secret)
                .compact();
    }

    /**
     * @Name: getClaimsByToken
     * @Params : [jwt]:[java.lang.String]
     * @Description : TODO
     * @Author : zpc20
     * @Date : 2023/11/1 22:25
     * @Return io.jsonwebtoken.Claims
     * @Throws
     */
    public Claims getClaimsByToken(String jwt){

        try{
            return Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(jwt)
                    .getBody();
        }catch(Exception e){
            return null;
        }
    }

    public boolean isTokenExpired(Claims claims){
           return claims.getExpiration().before(new Date());
    }


}
